{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Bidirectional_RNN_IMDB_Raw.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "id": "_2oXV-d2uNGB",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "d2e3e163-46f4-439e-e197-60711ca88d90"
      },
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ],
      "execution_count": 36,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "H_1TP9temHPU",
        "colab_type": "text"
      },
      "source": [
        "Raw IMBD dataset\n",
        "Downloadable Link : http://mng.bz/0tIo"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "8e-MncZ7u8Wf",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 208
        },
        "outputId": "d589c0c9-5a85-4c76-870a-6c3cb7927cfd"
      },
      "source": [
        "import os\n",
        "os.listdir(\"/content/drive/My Drive/ML and AI/Datasets\") # datasets save in my google drive"
      ],
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['cat vs dog',\n",
              " 'compresive_strength_concrete',\n",
              " 'Mnist_fashion_dataset',\n",
              " 'Boston Housing dataset',\n",
              " 'sonar dataset',\n",
              " 'Iris dataset',\n",
              " 'diabetes dataset',\n",
              " 'bbc dataset',\n",
              " 'IMDB dataset',\n",
              " 'jena_climate',\n",
              " 'Amazon_Reviews']"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 37
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OupSnmX-J0Ft",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "bd6bb6f7-61e5-49f6-faaf-bec857ab19bb"
      },
      "source": [
        "os.listdir(\"/content/drive/My Drive/ML and AI/Datasets/IMDB dataset\")"
      ],
      "execution_count": 38,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['IMDB Dataset.csv']"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 38
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "5mRJ3yt3vP14",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        },
        "outputId": "ad2c347e-605f-4bb2-cb10-9ced7667f872"
      },
      "source": [
        "import pandas as pd\n",
        "import tensorflow as tf\n",
        "\n",
        "df = pd.read_csv('/content/drive/My Drive/ML and AI/Datasets/IMDB dataset/IMDB Dataset.csv')\n",
        "df.head()"
      ],
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>review</th>\n",
              "      <th>sentiment</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>One of the other reviewers has mentioned that ...</td>\n",
              "      <td>positive</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>A wonderful little production. &lt;br /&gt;&lt;br /&gt;The...</td>\n",
              "      <td>positive</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>I thought this was a wonderful way to spend ti...</td>\n",
              "      <td>positive</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Basically there's a family where a little boy ...</td>\n",
              "      <td>negative</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Petter Mattei's \"Love in the Time of Money\" is...</td>\n",
              "      <td>positive</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                                              review sentiment\n",
              "0  One of the other reviewers has mentioned that ...  positive\n",
              "1  A wonderful little production. <br /><br />The...  positive\n",
              "2  I thought this was a wonderful way to spend ti...  positive\n",
              "3  Basically there's a family where a little boy ...  negative\n",
              "4  Petter Mattei's \"Love in the Time of Money\" is...  positive"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 39
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nDn4ExlFKxD5",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 69
        },
        "outputId": "b2f322e5-032e-45a2-c4f9-609fc890f415"
      },
      "source": [
        "df['sentiment'].value_counts()"
      ],
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "positive    25000\n",
              "negative    25000\n",
              "Name: sentiment, dtype: int64"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 40
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NTYCOEVOLaw-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "labels = df[\"sentiment\"]\n",
        "features = df[\"review\"]"
      ],
      "execution_count": 41,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vb6XwA9GOE9U",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "5166de53-c596-43db-bb03-58a032cce442"
      },
      "source": [
        "#Encoding Labels\n",
        "from sklearn import preprocessing\n",
        "\n",
        "le = preprocessing.LabelEncoder()\n",
        "labels = le.fit_transform(labels)\n",
        "print(labels)"
      ],
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[1 1 1 ... 0 0 0]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2HencTSaOE-4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Tokenizing the text\n",
        "from tensorflow.keras.preprocessing.text import Tokenizer\n",
        "\n",
        "max_words = 10000\n",
        "tokenizer = Tokenizer(num_words=max_words) \n",
        "tokenizer.fit_on_texts(features)\n",
        "features = tokenizer.texts_to_sequences(features)\n",
        "#print(features)"
      ],
      "execution_count": 43,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XoOzEfsHOFCA",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#Training & testing Split\n",
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "x_train, x_test, y_train, y_test = train_test_split(features,labels, test_size=0.2, random_state=1)"
      ],
      "execution_count": 44,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7t4x8CozS6uU",
        "colab_type": "text"
      },
      "source": [
        "# LSTM Using Reverse Seqence"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TqYuEqGSS5VQ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Reverses sequences ?\n",
        "R_x_train = [x[::-1] for x in x_train]\n",
        "R_x_test = [x[::-1] for x in x_test]"
      ],
      "execution_count": 45,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1Hx2_v-7V4qk",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# pad_sequences is used to ensure that all sequences in a list have the same length.\n",
        "\n",
        "maxlen = 20            # 20 word ka sentence hoga max\n",
        "\n",
        "from tensorflow.keras import preprocessing\n",
        "R_x_train = preprocessing.sequence.pad_sequences(R_x_train, maxlen=maxlen)\n",
        "R_x_test = preprocessing.sequence.pad_sequences(R_x_test, maxlen=maxlen)"
      ],
      "execution_count": 46,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "HRj16_7kV4w0",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# padding to enshoure all the sentence are of same length\n",
        "# NORMAL SEQUENCE\n",
        "\n",
        "x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)\n",
        "x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)      "
      ],
      "execution_count": 49,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GiZ_5wVjoNd8",
        "colab_type": "text"
      },
      "source": [
        "#LSTM Using Reverse Seqence"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "0FK-vwo5OFJ0",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "max_features = 10000\n",
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras import layers\n",
        "\n",
        "model = Sequential()\n",
        "model.add(layers.Embedding(max_features, 128))\n",
        "model.add(layers.LSTM(32))\n",
        "model.add(layers.Dense(1, activation='sigmoid'))\n",
        "\n",
        "model.compile(optimizer='rmsprop',\n",
        "loss='binary_crossentropy',\n",
        "metrics=['acc'])\n",
        "\n",
        "#model.summary()"
      ],
      "execution_count": 50,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bMy8HlodR_tw",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 364
        },
        "outputId": "eabb8e28-9d6f-4406-e4da-626863cf18f6"
      },
      "source": [
        "history = model.fit(R_x_train, y_train,\n",
        "                    epochs=10,\n",
        "                    batch_size=128,\n",
        "                    validation_split=0.2)"
      ],
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "250/250 [==============================] - 4s 18ms/step - loss: 0.5778 - acc: 0.6865 - val_loss: 0.5401 - val_acc: 0.7200\n",
            "Epoch 2/10\n",
            "250/250 [==============================] - 4s 17ms/step - loss: 0.4817 - acc: 0.7659 - val_loss: 0.5319 - val_acc: 0.7259\n",
            "Epoch 3/10\n",
            "250/250 [==============================] - 4s 14ms/step - loss: 0.4445 - acc: 0.7900 - val_loss: 0.5458 - val_acc: 0.7272\n",
            "Epoch 4/10\n",
            "250/250 [==============================] - 4s 14ms/step - loss: 0.4144 - acc: 0.8072 - val_loss: 0.5527 - val_acc: 0.7253\n",
            "Epoch 5/10\n",
            "250/250 [==============================] - 4s 14ms/step - loss: 0.3843 - acc: 0.8238 - val_loss: 0.5702 - val_acc: 0.7269\n",
            "Epoch 6/10\n",
            "250/250 [==============================] - 3s 14ms/step - loss: 0.3552 - acc: 0.8393 - val_loss: 0.5951 - val_acc: 0.7196\n",
            "Epoch 7/10\n",
            "250/250 [==============================] - 4s 14ms/step - loss: 0.3274 - acc: 0.8566 - val_loss: 0.6233 - val_acc: 0.7147\n",
            "Epoch 8/10\n",
            "250/250 [==============================] - 3s 14ms/step - loss: 0.3012 - acc: 0.8697 - val_loss: 0.6577 - val_acc: 0.7010\n",
            "Epoch 9/10\n",
            "250/250 [==============================] - 4s 14ms/step - loss: 0.2759 - acc: 0.8837 - val_loss: 0.7474 - val_acc: 0.7080\n",
            "Epoch 10/10\n",
            "250/250 [==============================] - 3s 14ms/step - loss: 0.2503 - acc: 0.8958 - val_loss: 0.7444 - val_acc: 0.7021\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "BL29yR9PYlE8",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 320
        },
        "outputId": "8f5b51a6-ec6d-45ac-a6ca-c6fbda8636cd"
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "def show_all(history):\n",
        "    def show(history,acc,val_acc,label):\n",
        "        epochs = range(1, len(history.history[acc])+1)\n",
        "        plt.plot(epochs,history.history[acc],label='Training '+label)\n",
        "        plt.plot(epochs,history.history[val_acc],label='Validation '+label)\n",
        "        plt.legend()\n",
        "        \n",
        "    plt.figure(figsize=(15,5))\n",
        "    \n",
        "    plt.subplot(121)\n",
        "    show(history,'acc','val_acc','acc')\n",
        "    plt.subplot(122)\n",
        "    show(history,'loss','val_loss','loss')\n",
        "show_all(history)"
      ],
      "execution_count": 52,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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Fi1adHbfXJHaYvELsOIt6H4PdLjR6TTVngq4CggJCaFTp0588cUXgOvO4tVXX40xhn/84x+kpqaydu1aFixYcPIX++msWLGCyZMns3r1ambOnMny5ctP7rviiitYvnw5a9asoU2bNrzxxht07dqVQYMG8eSTT7J69WqaN29+8vj8/HxGjhzJlClT+P777ykuLubll18+uT8sLIyVK1cyevTo03ZBCQ8PZ/bs2axcuZIpU6Zw1113AfDFF1/wySefsGzZMtasWcP9998PwIgRI7jjjjtYs2YNixcvpmHDhmf3TRWRn9m4J4ex09fS5V9zeeLLTTQNC+CV65JZ9mA/xg1qR3xUsLpISrVTE9vI8h599FGSkpJYu3Yt//znP7nhhhsAeOqppxg/fjyrV69m0aJF1KlTh/fff5+LLrqI1atXs2bNGhITE3/X91SkVtnwCcx+GNoNgb6POJ3GLbhfF8ovxsLe7yv3mg3iYeC/f/WQH7qIXH755UyePJk33ngDgKlTpzJhwgSKi4vZs2cPGzZsoH379qe9xqJFixgyZAj+/q6Z4QYNGnRy37p163jooYc4cuQIubm5P+mKcjqbN28mJiaGli1bAnDjjTcyfvx47r77bsDV2AF06NCBjz766GfnFxUVMWbMGFavXo2npydbtmwBYM6cOdx0000nM4aEhHDs2DGysrIYMmQIAH5+uvMvUllKSi2zN+zj7cXbWbrtEH7eHlyRHMWNXZvQukFdp+OJu1EbCZx9G1neN998w/Tp0wHo27cv2dnZ5OTk0K1bN+69915GjBjBFVdcQVRUFB07dmTUqFEUFRUxePBgFXAiZ5KZCh/dAlGdYPDL4KFnSxWh71IFXX755cydO5eVK1eSl5dHhw4d2L59O0899RRz585l7dq1XHLJJeTn5/+u648cOZIXX3yR77//nkcfffR3X+cHvr6+AHh6elJcXPyz/c8++ywRERGsWbOG1NTUk11fRKRqHMkr5NUFrm6St723gl2HTvDAwNYsfeAC/nVFvIo3cSs1rY2siLFjx/L6669z4sQJunXrxqZNm+jZsycLFy4kMjKSkSNH8s4775xVTpEa7XAGfDAMghrA8A/Au47TidyG+z2BO8NdwHMlMDCQPn36MGrUKIYPHw5ATk4OAQEBBAcHs2/fPr744gt69+79i9fo2bMnI0eO5IEHHqC4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\n",
            "text/plain": [
              "<Figure size 1080x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bT-OsxrNoddY",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 86
        },
        "outputId": "79e275c9-d4f4-4d5f-c217-16af004bc1b6"
      },
      "source": [
        "evaluation = model.evaluate(R_x_test,y_test,verbose=2)\n",
        "print()\n",
        "print(\"Loss: \",evaluation[0]*100,\"%\")\n",
        "print(\"Accuracy: \",evaluation[1]*100,\"%\")"
      ],
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "313/313 - 1s - loss: 0.7276 - acc: 0.7041\n",
            "\n",
            "Loss:  72.75513410568237 %\n",
            "Accuracy:  70.41000127792358 %\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BbV7M_aXS3n4",
        "colab_type": "text"
      },
      "source": [
        "#Training and evaluating a bidirectional LSTM"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "6nCdbeohR_w4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# pad_sequences is used to ensure that all sequences in a list have the same length.\n",
        "\n",
        "maxlen = 20            # 20 word ka sentence hoga max\n",
        "\n",
        "from tensorflow.keras import preprocessing\n",
        "x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)\n",
        "x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)"
      ],
      "execution_count": 55,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ww0t0J7OR_yc",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Bidirectional LSTM\n",
        "\n",
        "model = Sequential()\n",
        "model.add(layers.Embedding(max_features, 32))\n",
        "model.add(layers.Bidirectional(layers.LSTM(32)))\n",
        "model.add(layers.Dense(1, activation='sigmoid'))\n",
        "\n",
        "model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])"
      ],
      "execution_count": 56,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "VkvXT-TkR_1k",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 364
        },
        "outputId": "79ab6369-1292-4388-ae21-bac8c732157e"
      },
      "source": [
        "history = model.fit(x_train, y_train,\n",
        "                    epochs=10,\n",
        "                    batch_size=128,\n",
        "                    validation_split=0.2)"
      ],
      "execution_count": 57,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "250/250 [==============================] - 5s 19ms/step - loss: 0.5256 - acc: 0.7273 - val_loss: 0.4830 - val_acc: 0.7635\n",
            "Epoch 2/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.4211 - acc: 0.8075 - val_loss: 0.4708 - val_acc: 0.7720\n",
            "Epoch 3/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.3879 - acc: 0.8258 - val_loss: 0.4664 - val_acc: 0.7770\n",
            "Epoch 4/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3619 - acc: 0.8397 - val_loss: 0.4727 - val_acc: 0.7753\n",
            "Epoch 5/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.3389 - acc: 0.8523 - val_loss: 0.4968 - val_acc: 0.7764\n",
            "Epoch 6/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.3179 - acc: 0.8625 - val_loss: 0.5241 - val_acc: 0.7736\n",
            "Epoch 7/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.2990 - acc: 0.8710 - val_loss: 0.5276 - val_acc: 0.7682\n",
            "Epoch 8/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.2823 - acc: 0.8796 - val_loss: 0.5273 - val_acc: 0.7692\n",
            "Epoch 9/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.2680 - acc: 0.8881 - val_loss: 0.5548 - val_acc: 0.7701\n",
            "Epoch 10/10\n",
            "250/250 [==============================] - 4s 15ms/step - loss: 0.2531 - acc: 0.8942 - val_loss: 0.5921 - val_acc: 0.7646\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JU_VwKDSR_4s",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#show_all(history)"
      ],
      "execution_count": 58,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "mdg9-_1domz0",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 86
        },
        "outputId": "731c2436-e05a-46dc-8d17-a061c5d4728d"
      },
      "source": [
        "evaluation = model.evaluate(x_test,y_test,verbose=2)\n",
        "print()\n",
        "print(\"Loss: \",evaluation[0]*100,\"%\")\n",
        "print(\"Accuracy: \",evaluation[1]*100,\"%\")"
      ],
      "execution_count": 59,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "313/313 - 2s - loss: 0.6109 - acc: 0.7581\n",
            "\n",
            "Loss:  61.08575463294983 %\n",
            "Accuracy:  75.80999732017517 %\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FJDPI6oTdMnA",
        "colab_type": "text"
      },
      "source": [
        "#Training a bidirectional GRU"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s0FvMBc1N7RQ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from tensorflow.keras.models import Sequential\n",
        "from tensorflow.keras import layers\n",
        "from tensorflow.keras.optimizers import RMSprop"
      ],
      "execution_count": 60,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NsLgDeH6dRAQ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "model = Sequential()\n",
        "model.add(layers.Embedding(max_features, 32))\n",
        "model.add(layers.Bidirectional(layers.GRU(32)))\n",
        "model.add(layers.Dense(1, activation='sigmoid'))\n",
        "\n",
        "model.compile(optimizer=RMSprop(), loss='binary_crossentropy', metrics=['acc'])"
      ],
      "execution_count": 61,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xmVNd06GdW6Y",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 364
        },
        "outputId": "058f330d-0960-4b3b-b0fd-69d9679c59b8"
      },
      "source": [
        "history = model.fit(x_train, y_train,\n",
        "                    epochs=10,\n",
        "                    batch_size=128,\n",
        "                    validation_split=0.2)"
      ],
      "execution_count": 62,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Epoch 1/10\n",
            "250/250 [==============================] - 5s 19ms/step - loss: 0.5401 - acc: 0.7137 - val_loss: 0.4766 - val_acc: 0.7716\n",
            "Epoch 2/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.4258 - acc: 0.8046 - val_loss: 0.4738 - val_acc: 0.7735\n",
            "Epoch 3/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3986 - acc: 0.8196 - val_loss: 0.4746 - val_acc: 0.7742\n",
            "Epoch 4/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3821 - acc: 0.8303 - val_loss: 0.4663 - val_acc: 0.7761\n",
            "Epoch 5/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3693 - acc: 0.8369 - val_loss: 0.4693 - val_acc: 0.7766\n",
            "Epoch 6/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3593 - acc: 0.8419 - val_loss: 0.4701 - val_acc: 0.7710\n",
            "Epoch 7/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3458 - acc: 0.8478 - val_loss: 0.4819 - val_acc: 0.7746\n",
            "Epoch 8/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3319 - acc: 0.8545 - val_loss: 0.4943 - val_acc: 0.7763\n",
            "Epoch 9/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3176 - acc: 0.8619 - val_loss: 0.4992 - val_acc: 0.7739\n",
            "Epoch 10/10\n",
            "250/250 [==============================] - 4s 16ms/step - loss: 0.3017 - acc: 0.8701 - val_loss: 0.5028 - val_acc: 0.7739\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "eBQMFoqxdZWo",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#show_all(history)"
      ],
      "execution_count": 63,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Gs2vYBOdddEI",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 86
        },
        "outputId": "eb92caae-1926-4e30-bb11-36aca72bd83a"
      },
      "source": [
        "evaluation = model.evaluate(x_test,y_test,verbose=2)\n",
        "print()\n",
        "print(\"Loss: \",evaluation[0]*100,\"%\")\n",
        "print(\"Accuracy: \",evaluation[1]*100,\"%\")"
      ],
      "execution_count": 64,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "313/313 - 2s - loss: 0.5031 - acc: 0.7665\n",
            "\n",
            "Loss:  50.30665993690491 %\n",
            "Accuracy:  76.64999961853027 %\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jh5zMfdPpPYs",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}